#include <stdio.h>
#include <stdlib.h>
#include <time.h>
struct Vector
{
    int* Num;    //Vettore di numeri, rappresentano un operando
    int Dim;
};

void Riempi(struct Vector*, int);
void Stampa(struct Vector*, int, struct Vector*);
void InvertiNumeri(struct Vector*);
void Moltiplica(struct Vector*, int, struct Vector*);


int main()
{
  srand ( time(NULL) );                    //Imposto il seed 
 
  struct Vector Operando1;               //Vettore del Operando1
  Operando1.Dim= ((rand() % 5) + 2)*1;
  Operando1.Num = (int *)malloc(sizeof(int)*Operando1.Dim);
  Riempi(&Operando1, 0);
  
  int Operando2 =  (rand() % 9)+1;
  
  struct Vector Risultato;              //Vettore del risultato
  int i;

  Risultato.Dim = Operando1.Dim+1;
  Risultato.Num = (int *)malloc(sizeof(int) * (Risultato.Dim));
  Riempi(&Risultato, 1);
  
  printf("*****Situazione Iniziale*****\n\n");      //Stampo la situazione iniziale
  Stampa(&Operando1, Operando2, &Risultato);
  
  InvertiNumeri(&Operando1);
  Moltiplica(&Operando1, Operando2, &Risultato);
  InvertiNumeri(&Operando1);
  InvertiNumeri(&Risultato);
  
  printf("\n*****Risultato Divisione Dritta*****\n\n");      //Stampo la situazione iniziale, con Operando1 e sottrendo
  Stampa(&Operando1, Operando2, &Risultato);


  system("Pause");                      //GG. Ricordarsi di valorizzare sempre i cazzo di vettori o fan bordello
  return 0;
}

void Moltiplica(struct Vector *Operando1, int Operando2, struct Vector *Risultato)
{
     int i;
     int Resto=0;
     for(i=0; i<Operando1->Dim; i++)
     {
         Risultato->Num[i]=(Resto+(Operando1->Num[i]*Operando2))%10;
         Resto=(Resto+(Operando1->Num[i]*Operando2))/10;   
     }
     if(Resto!=0)
         Risultato->Num[i]=Resto;                       
}

void Riempi(struct Vector *Operando, int ResOne)
{
    int i;
    for(i=0; i <Operando->Dim; i++)
        if(ResOne == 1)
            Operando->Num[i]=0;
        else
        {
            if( i == 0)
                Operando->Num[i]=(rand()%9)+1;     //Riempio le caselle di numeri con numeri int da 0 a 9
            else
                Operando->Num[i]=rand()%10;
        }
}

void Stampa(struct Vector *Operando1, int Operando2, struct Vector *Operando3)
{
    int i;                                  //Non credo servano commenti, ciclo for che stampa tutti i numeri
    printf("Primo Operando:\n");
    for(i=0; i <Operando1->Dim; i++)
        printf("%d ", Operando1->Num[i]);
    printf("\n\nSecondo Operando: %d\n", Operando2);


    printf("\n\nRisultato:\n");
    for(i=0; i <Operando3->Dim; i++)
        printf("%d ", Operando3->Num[i]);
    printf("\n\n");

}

void InvertiNumeri(struct Vector *Operando1)
{
    int i=0, tmp=0;                                  //Inverto il vettore di numeri scambiando due a due
    for(i=0; i<Operando1->Dim/2; i++) 
    {
        tmp=Operando1->Num[Operando1->Dim-(1+i)];
        Operando1->Num[Operando1->Dim-(1+i)] = Operando1->Num[i];
        Operando1->Num[i]=tmp;
    }
}
